home *** CD-ROM | disk | FTP | other *** search
- /* Program EX_0701.C
- Listing 14C - see documentation in TUTOR.SSS
- */
-
- #include "SSSC.H"
-
- #define ARRIVL 1
- #define STARTA 2
- #define ENDACT 3
- #define NEXTAC 4
-
- #define ORD1 1
- #define ORD2 2
- #define DELUX1 3
- #define DELUX2 4
-
- int s, ecode, server[2];
-
- void prime()
- {
- server[0] = 1;
- server[1] = 1;
- INIQUE(5, 3, 1);
- INISTA(1, "Interrupts", 0, 0, 0.0, 0.0);
- SIMEND(60.0);
- CREATE(0.0, 0);
- }
-
- int sindex()
- {
- if (IDE() < DELUX1) return(IDE() - 1);
- else return((IDE() - ORD2) - 1);
- }
-
- int shortr()
- {
- if (NQ(4) + NQ(2) < NQ(3) + NQ(1)) SETIDE(IDE() + 1);
- return(IDE());
- }
-
- void preemp()
- {
- int i, preide; double remt;
- QUEUE(5, 0.0);
- i = 1;
- while ((i <= NC()) &&
- ((IDIC(i) > ORD2) || (NEIC(i) != ENDACT)))
- i++;
-
- if (i <= NC())
- {
- remt = TIC(i) - T();
- REMVFC(i);
- preide = IDE();
- SETA(1, A(1) + 1);
- SETA(2, remt);
- SETQDC(1, "LIFO");
- QUEUE(IDE(), 0.0);
- SETQDC(1, "FIFO");
- REMVFQ(5, 1);
- SCHED(0.0, STARTA, preide + 2);
- } else
-
- {
- REMVFQ(5, 1);
- QUEUE(shortr(), 0);
- }
- }
-
- main()
- {
- prime();
-
- do
- {
- if ((ecode = NEXTEV()) > 0)
- switch(ecode)
- {
-
- case ARRIVL:
- CREATE(EX(2), 0);
- SETA(1, 0.0);
- SETA(2, TR(1, 2, 3));
- if (RA() < 0.25) SETIDE(DELUX1);
- else SETIDE(ORD1 );
- SCHED(0.0, NEXTAC, IDE());
- break;
-
- case NEXTAC:
- if (server[0] > 0)
- SCHED(0.0, STARTA, IDE());
- else if (server[1])
- SCHED(0.0, STARTA, IDE()+1);
- else if (IDE() == DELUX1)
- preemp();
- else
- QUEUE(shortr(), 0.0);
- break;
-
- case STARTA:
- (server[sindex()])--;
- SCHED(A(2), ENDACT, IDE());
- break;
-
- case ENDACT:
- s = sindex();
- (server[s])++;
- if (IDE() < DELUX1) TALLY(1, A(1));
- DISPOS();
- if (NQ(s + 3))
- {
- REMVFQ(s + 3, 1);
- SCHED(0, STARTA, IDE());
- }
-
- else if (NQ(s + 1))
- {
- REMVFQ(s + 1, 1);
- SCHED(0, STARTA, IDE());
- }
- break;
- }
- } while (ecode);
-
- SUMRY("");
- }